/*******************************************************************************
** Edits.h: contiene todo lo necesario para trabajar con la solapa Edits.
**
** author: M-S Hernández-García
**
**  This file is part of TEIDE2.
**
**  TEIDE2 is free software: you can redistribute it and/or modify
**  it under the terms of the GNU General Public License as published by
**  the Free Software Foundation, either version 3 of the License, or
**  (at your option) any later version.
**
**  Foobar is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
**
*******************************************************************************/

#ifndef EDITS_H
#define EDITS_H

//#include <Q3Header>
//#include <Q3Table>
#include <QObject>
#include <QVariant>
#include <QAction>
#include <QApplication>
#include <QButtonGroup>
#include <QComboBox>
#include <QFrame>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>
#include <QMap>
#include "MicroDatos.h"
#include "TablaModelE.h"

typedef
  struct
  {
    bool Sintactico;
    bool Lexico;
    bool EditWarning;
    QSet<unsigned> Variables;
  } TInfoEdits;

class TFmeEdits : public QWidget
{
    Q_OBJECT

public:

    QFrame *SbrBarraEstado;
    QFrame *SbrBarraEstado1;
    QLabel *LabBarraEstado1;
    QFrame *SbrBarraEstado2;
    QLabel *LabBarraEstado2;
    QFrame *PanVariables;
    QLabel *LabVariable;
    QLabel *LabEdit;
    QLabel *LabOperadores;
    QLabel *LabMissing;
    QComboBox *CbxVariables;
    QComboBox *CbxMissing;
    QLineEdit *EdtEdit;
    QComboBox *CbxOperadores;
    QPushButton *ButModificarEdit;
    QPushButton *ButInsertarEdit;
    QPushButton *ButBorrarEdit;
    QFrame *PanValidarEdit;
    QFrame *PanContenedor;
    QLabel *LabValidacionSintactica;
    QPushButton *ImgValidacionSintactica;
    QLabel *LabValidacionLexica;
    QPushButton *ImgValidacionLexica;
    QLabel *LabIrA;
    QLabel *LabFiltro;
    QLineEdit *EdtIrA;
    QPushButton *ButSigEditMal;
    QLineEdit *EdtFiltro;    
    MiTabla *view;
    MiTabla *view2;    
    QSqlDatabase *AdqConsulta;
    QComboBox *VisualizarEd;

    TFmeEdits(QWidget* parent, const char* name, Qt::WindowFlags fl, QSqlDatabase *AdcConexionBD, QString NombreTabla, TFmeMicroDatos *FmeMicroDatosAsociados, bool Xml, QString NombreBaseDatos, bool *correcto, bool excel, QTabWidget *PctContenedorPrincipal);
    void ajustarSize();
    //void updateGeometry ();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Asociar las clases provenientes de etapas anteriores.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void AsociarClases(TFmeMicroDatos *FmeMicroDatosAsociados);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Actualizar la información de la Variable actual.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ActualizarInformacionVariable(unsigned IndiceVariable);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Actualizar la validacion del edit cuando existe un error.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ActualizarValidacionEditConError(bool Sintactico, bool Lexico);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Actualizar la validacion del edit cuando no existe ningún error.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ActualizarValidacionEditSinError();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Actualizar la información de validación del edit.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ActualizarValidacionEdit(unsigned IndiceEdit);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Actualizar el mensaje de pantalla sobre inserción de edit.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ActualizarMensajeEditActual();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Borrar el edit actual.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void BorrarEdit();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Cargar las Variables posibles en la lista desplegable.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CargarVariablesEnLista();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Cargar los valores missing posibles en la lista desplegable.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CargarMissingEnLista();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Cargar los edits en la rejilla de visualización.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CargarEditsEnRejilla();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Compactar el vector de información de edit.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CompactarVectorInfoEdits();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Compactar la rejilla de edits.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CompactarRejilla();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Crear vectores de pertenencia de variables.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CrearVectorPertenenciaEdits();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Cargar el vector de edits warning.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CargarVectorEditsWarning();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Deshabilitar los controles para la gestión de edits.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void DeshabilitarControlesEdit();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Escribir mensaje de información en la barra de estado.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void EscribirInformacion();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Devuelve TRUE si el Edit actual es sintáctica y léxicamente correcto.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    bool EditActualCorrecto();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Devuelve TRUE si el Edit por parámetros es sintáctica y léxicamente correcto.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    bool EditCorrecto(unsigned IndiceEdit);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Devuleve TRUE si es Edit tiene un error, o si los edits han sido validado, o si existen edits.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    bool EditWarning(unsigned IndiceEdit);
    bool EditsValidados();
    bool ExistenEdits();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Fijar el ancho de las columnas de la rejilla.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void FijarAnchoColumnasRejilla();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Fijar los títulos de las columnas de la rejilla.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void FijarTitulosColumnasRejilla();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Fijar la cantidad de datos que intervienen en el proceso.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void FijarCantidadDatos();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Fijar los identificadores de cada fila.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void FijarIdsFilasRejilla();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Obtener el conjunto correspondiente a la lista de variables.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    QSet<unsigned> GetConjuntoDesdeLista(QStringList *Lista);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Varias funciones
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    QString GetNombreTabla();
    QSet<unsigned> GetVariablesEdits(unsigned IndiceEdit);
    unsigned GetNumEdits();
    TFmeMicroDatos *GetMicroDatosAsociados();
    double GetPorcentajeEditsValidados();
    QString GetEdit(unsigned IndiceEdit);
    unsigned GetIdEdit(unsigned IndiceEdit);
    unsigned GetNumEditsVariable(unsigned IndiceVariable);
    QSet<unsigned> GetEditsConVariable(unsigned IndiceVariable);
    QComboBox *GetVisualizarEd();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Obtener la lista correspondiente al conjunto de variables.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    QStringList *GetListaDesdeConjunto(QSet<unsigned> Conjunto);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Habilitar los controles para la gestión de edits.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void HabilitarControlesEdit();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Inicializar la rejilla de visualización de Variables.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void InicializarRejillaVariable();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Insertar un nuevo edit.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void InsertarEdit();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Modificar el edit actual.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ModificarEdit();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Mostrar la información asociada a la fila y a la columna.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void MostrarInfoAsociada(unsigned Fila, unsigned Columna, bool Fijar);
    void MostrarInfoAsociada(unsigned Fila, unsigned Columna, unsigned numedits, bool Fijar, QStringList listaHA, QString **MatrizEditsA, QStringList listaVA);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Pinta la rejilla variable.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void repintarVariable(bool filtro, bool falso);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Validar los edits cargados.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ValidarEdits();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Validar la sintaxis y el léxico de la Edit actual.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ValidarEditActual();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Devuelve TRUE si la variable esta en edit indicado.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    bool VariableEnEdit(unsigned IndiceVariable, unsigned IndiceEdit);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Vuelve a pintar las celda de la rejilla principal
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void repintar();  
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


public slots:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PULSAR EL BOTÓN DE MODIFICAR EDIT.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ButModificarEditClick();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PULSAR EL BOTÓN DE INSERTAR EDIT.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ButInsertarEditClick();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PULSAR EL BOTÓN DE BORRAR EDIT.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ButBorrarEditClick();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PULSAR EL BOTÓN DE INFORMACION DE ERROR.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ButValidacionSintacticaClick();
    void ButValidacionLexicaClick();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PULSAR EL BOTÓN DE IR AL SIGUIENTE EDIT INCORRECTO.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ButSigEditMalClick();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SELECCIONAR UNA VARIABLE DEL COMBOBOX DE VARIABLES.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CbxVariablesCloseUp(QString var);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SELECCIONAR UN OPERADOR DEL COMBOBOX DE OPERADORES.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CbxOperadoresCloseUp(QString op);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SELECCIONAR UN MISSING DEL COMBOBOX DE MISSING.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CbxMissingCloseUp(QString mis);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PRESIONAR UNA TECLA EN EL EDIT DE EDICIÓN DE EDITS.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void EdtEditKeyDown();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PRESIONAR UNA TECLA EN EL EDIT DE IR A EDIT.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void EdtIrAKeyDown();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TOMAR POSESIÓN DEL CONTROL EL EDIT DE EDICION DE EDITS.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void EdtEditEnter();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PULSAR UNA TECLA EN EL EDIT DE FILTRO DE EDITS.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void EdtFiltroKeyDown();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SELECCIONAR UNA CELDA EN LA REJILLA.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void SgrRejillaSelectCell(const QModelIndex& index);
    void SgrRejillaSelectCellV(const int& index);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MODO DE VISUALIZAR LA TABLA DE EDITS.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void VisualizarEdCloseUp(int index);

private:

  TFmeMicroDatos *FmeMicroDatosAsociados;
  TFmeVariables *FmeVariablesAsociadas;
  unsigned UltimoEditVisitadoPorFiltro;
  unsigned UltimoEditVisitadoPorEdit;
  unsigned IndiceEdit;
  QString IconoBien, IconoMal;
  QString Name;
  QString NombreTabla;
  QString VariablesALeer;
  unsigned NumEdits;         // num de edits actuales
  unsigned NumEditsTotales;  // num de edits totales incluyendo los borrados
  unsigned NumEditsValidados;
  TInfoEdits *VectorInfoEdits;
  unsigned *ListaIds;
  QSet<unsigned> *VectorPertenenciaEdits;
  QTextEdit *MemLogs;
  QSqlQuery *query2;
  QString NombreBaseDatos;
  bool Xml;
  QString **MatrizEditsS;
  TablaModelE *model;
  TablaModelInfo *model2;
  QStringList listaH;
  QStringList listaV;
  QStringList listaH2;
  QStringList listaV2;
  QString *VectorDatosS;
  bool Excel;
  QString mensajeE;
};


#endif // EDITS_H
